#ifndef __BHTTP_CLIENT_H__
#define __BHTTP_CLIENT_H__
#pragma once

#include <string>
#include <memory>
#include "thread.h"
#include "request.h"
#include "response.h"

namespace bhttp
{

using request_ptr = std::shared_ptr<request>;
using response_ptr = std::shared_ptr<response>;
using response_callback = std::function<void(const std::shared_ptr<request>&, const std::shared_ptr<response>&)>;

class client_impl;
class client
{
public:
    explicit client(const std::string& host, int timeout = 3, const std::string& ca = std::string());
    ~client();
    // 删除拷贝构造
    client(const client&) = delete;
    // 删除赋值
    client& operator=(const client&) = delete;

    /**
     * @brief timeout 设置连接超时时间
     * @param secs 时间值(秒)
     * @return void
     */
    void timeout(int secs);
    /**
     * @brief timeout 返回连接超时时间
     * @return 超时时间
     */
    int timeout() const;

    /**
     * @brief capath 设置CA证书路径
     * @param ca 证书路径
     * @return void
     */
    void capath(const std::string& ca);
    /**
     * @brief capath 返回CA证书路径
     * @return 证书路径
     */
    const std::string capath() const;

    /**
     * @brief host 设定服务器地址
     * @param host 服务器地址
     * @return void
     */
    void host(const std::string& host);
    /**
     * @brief host 返回服务器host
     * @return 服务器host
     */
    const std::string host() const;

    /**
     * @brief send 异步发送请求
     * @param req 请求参数
     * @param res_cb 结果回调函数
     * @return void
     */
    void send(const request_ptr& req, const response_callback& res_cb);
private:
    //
    std::shared_ptr<client_impl> impl_;
};

}

#endif //__BHTTP_CLIENT_H__
